package com.jl15988.pguard.platform;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 进程平台配置类
 * <p>
 * 该类负责管理进程平台的配置信息，包括平台的注册、获取等功能。
 * 用户可以继承该类并重写相关方法来自定义平台配置。
 * </p>
 *
 * @author jl15988
 * @since 1.0.0
 */
public class ProcessPlatformConfig {
    /**
     * 平台映射表，key为平台名称，value为平台实现
     */
    protected final Map<String, ProcessPlatform> platforms = new ConcurrentHashMap<>();

    /**
     * 当前使用的平台
     */
    protected ProcessPlatform currentPlatform;

    /**
     * 构造函数
     * <p>
     * 初始化默认的平台配置，包括Windows和Linux平台。
     * </p>
     */
    public ProcessPlatformConfig() {
        initDefaultPlatforms();
        initCurrentPlatform();
    }

    /**
     * 初始化默认平台
     * <p>
     * 可以被子类重写以提供不同的默认平台实现。
     * </p>
     */
    protected void initDefaultPlatforms() {
        addPlatform(new WindowsProcessPlatform());
        addPlatform(new LinuxProcessPlatform());
    }

    /**
     * 初始化当前平台
     * <p>
     * 可以被子类重写以提供不同的平台选择逻辑。
     * </p>
     */
    protected void initCurrentPlatform() {
        String osName = System.getProperty("os.name").toLowerCase();
        if (osName.contains("windows")) {
            currentPlatform = platforms.get("Windows");
        } else {
            currentPlatform = platforms.get("Linux");
        }
    }

    /**
     * 添加平台
     *
     * @param platform 平台实现
     */
    public void addPlatform(ProcessPlatform platform) {
        platforms.put(platform.getPlatformName(), platform);
    }

    /**
     * 获取平台
     *
     * @param platformName 平台名称
     * @return 平台实现
     */
    public ProcessPlatform getPlatform(String platformName) {
        return platforms.get(platformName);
    }

    /**
     * 获取当前平台
     *
     * @return 当前平台实现
     */
    public ProcessPlatform getCurrentPlatform() {
        return currentPlatform;
    }

    /**
     * 设置当前平台
     *
     * @param platformName 平台名称
     * @return 是否设置成功
     */
    public boolean setCurrentPlatform(String platformName) {
        ProcessPlatform platform = platforms.get(platformName);
        if (platform != null) {
            currentPlatform = platform;
            return true;
        }
        return false;
    }

    /**
     * 获取所有支持的平台名称
     *
     * @return 平台名称集合
     */
    public java.util.Set<String> getSupportedPlatforms() {
        return platforms.keySet();
    }

    /**
     * 检查平台是否支持
     *
     * @param platformName 平台名称
     * @return 是否支持
     */
    public boolean isPlatformSupported(String platformName) {
        return platforms.containsKey(platformName);
    }
}
